﻿using MySql.Data.MySqlClient;
using System;
using System.Configuration;
using System.Data;

namespace CD
{
    /// <summary>
    /// Clase para ejecutar los comando o las consultas a la base de datos.
    /// </summary>
    public class BDConexion
    {
        protected BDConexion() { }

        #region Atributos

        /// <summary>
        /// Atributo para asignar el procedimiento almacenado para el mantenimiento de los registros.
        /// </summary>
        private string _ProcedimientoMan = string.Empty;

        /// <summary>
        /// Atributo para asignar el procedimiento almacenado para listar los registros.
        /// </summary>
        private string _ProcedimientoLis = string.Empty;

        /// <summary>
        /// Atributo para asignar el procedimiento almacenado para buscar un registro.
        /// </summary>
        private string _ProcedimientoLisId = string.Empty;

        /// <summary>
        /// Atributo para asignar el procedimiento almacenado para buscar registros.
        /// </summary>
        private string _ProcedimientoLisBus = string.Empty;

        private string _ProcedimientoLisNom = string.Empty;

        private string _ProcedimientoImgServ = string.Empty;

        private string _ProcedimientoLisPareja = string.Empty;

        /// <summary>
        /// Atributo de solo lectura en donde se guarda el parametro ID.
        /// </summary>
        private readonly string _ParametroId = "ID";

        /// <summary>
        /// Atributo de solo lectura en donde se guarda el parametro USUARIO.
        /// </summary>
        private readonly string _ParametroUsuario = "USUARIO";

        /// <summary>
        /// Atributo de solo lectura en donde se guarda el parametro NOMBRE.
        /// </summary>
        private readonly string _ParametroNombre = "NOMBRE";

        /// <summary>
        /// Atributo de solo lectura en donde se guarda el parametro VALOR.
        /// </summary>
        private readonly string _ParametroValor = "valor";

        /// <summary>
        /// Atributo de solo lectura en donde se guarde el parametro ACCION.
        /// </summary>
        private readonly string _ParametroAccion = "Accion";

        /// <summary>
        /// Atributo de solo lectura en donde se guarda el valor Agregar del parametro ACCION.
        /// </summary>
        private readonly string _AccionAgregar = "Agregar";

        /// <summary>
        /// Atributo de solo lectura en donde se guarda el valor Agregar del parametro ACTUALIZAR.
        /// </summary>
        private readonly string _AccionActualizar = "Actualizar";

        /// <summary>
        /// Atributo de solo lectura en donde se guarda el valor Agregar del parametro ELIMINAR.
        /// </summary>
        private readonly string _AccionEliminar = "Eliminar";

        #endregion 

        #region Propiedades

        /// <summary>
        /// Propiedad para asignar el nombre del procedimiento almacenado para el mantenimiento.
        /// </summary>
        protected string ProcedimientoMan
        {
            get { return _ProcedimientoMan; }
            set { _ProcedimientoMan = value; }
        }

        /// <summary>
        /// Propiedad para asignar el nombre del procedimiento almacenado para listar los registros.
        /// </summary>
        protected string ProcedimientoLis
        {
            get { return _ProcedimientoLis; }
            set { _ProcedimientoLis = value; }
        }

        /// <summary>
        /// Propiedad para asignar el nombre del procedimiento almacenado para buscar un registro.
        /// </summary>
        protected string ProcedimientoLisId
        {
            get { return _ProcedimientoLisId; }
            set { _ProcedimientoLisId = value; }
        }

        /// <summary>
        /// Propiedad para asignar el nombre del procedimiento almacenado para la buscar registros.
        /// </summary>
        protected string ProcedimientoSelBus
        {
            get { return _ProcedimientoLisBus; }
            set { _ProcedimientoLisBus = value; }
        }

        /// <summary>
        /// Propiedad de solo lectura para almacenar el parametro ID.
        /// </summary>
        protected string ParametroId
        {
            get { return _ParametroId; }
        }

        /// <summary>
        /// Propiedad de solo lectura para almacenar el parametro USUARIO.
        /// </summary>
        protected string ParametroUsuario
        {
            get { return _ParametroUsuario; }
        }

        /// <summary>
        /// Propiedad de solo lectura para almacenar el parametro NOMBRE.
        /// </summary>
        protected string ParametroNombre
        {
            get { return _ParametroNombre; }
        }

        /// <summary>
        /// Propiedad de solo lectura para almacenar el parametro VALOR.
        /// </summary>
        protected string ParametroValor
        {
            get { return _ParametroValor; }
        }

        /// <summary>
        /// Propiedad de solo lectura para almacenar el parametro ACCION.
        /// </summary>
        protected string ParametroAccion
        {
            get { return _ParametroAccion; }
        }

        /// <summary>
        /// Propiedad de solo lectura para almacenar el valor AGREGAR del parametro VALOR.
        /// </summary>
        protected string AccionAgregar
        {
            get { return _AccionAgregar; }
        }

        /// <summary>
        /// Propiedad de solo lectura para almacenar el valor ACTUALIZAR del parametro VALOR.
        /// </summary>
        protected string AccionActualizar
        {
            get { return _AccionActualizar; }
        }

        /// <summary>
        /// Propiedad de solo lectura para almacenar el valor ELIMINAR del parametro VALOR.
        /// </summary>
        protected string AccionEliminar
        {
            get { return _AccionEliminar; }
        }

        protected string ProcedimientLisNom
        {
            get { return _ProcedimientoLisNom; }
            set { _ProcedimientoLisNom = value; }
        }

        protected string ProcedimientoImgServ
        {
            get { return _ProcedimientoImgServ; }
            set { _ProcedimientoImgServ = value; }
        }

        protected string ProcedimientoLisPareja
        {
            get { return _ProcedimientoLisPareja; }
            set { _ProcedimientoLisPareja = value; }
        }

        #endregion
          
        #region Funciones

        /// <summary>
        /// Funcion para ejecutar comandos (Aregar|Modificar|Eliminar) en la base de datos.
        /// </summary>
        /// <param name="p_oMySqlCommand">MySqlCommad</param>
        /// <returns>String Resultado del comando(Cambios aplicados con exito.|Ocurrio un error al guardar los cambios.|El registro no se puede borrar por que tiene reistros relacionados.)</returns>
        protected String EjecutarComando(MySqlCommand p_oMySqlCommand)
        {
            int intResultado = 0;
            try
            {
                using(p_oMySqlCommand)
                {
                    using(MySqlConnection oMySqlConnection = new MySqlConnection(ConfigurationManager.ConnectionStrings["ProyectoSalvadorDelMundo.Properties.Settings.Connectionstring"].ConnectionString))
                    {
                        p_oMySqlCommand.CommandType = CommandType.StoredProcedure;
                        p_oMySqlCommand.Connection = oMySqlConnection;
                        p_oMySqlCommand.Connection.Open();
                        intResultado = p_oMySqlCommand.ExecuteNonQuery();
                        p_oMySqlCommand.Connection.Close();
                    }
                }
            }
            catch(MySqlException ex)
            {
                return ex.Message.IndexOf("Cannot delete or update a parent row: a foreign key constraint fails") > -1 ? "El registro no se puede borrar por que tiene registros relacionados." : ex.Message ;
            }
            return intResultado > 0 ? "Cambios aplicados con exito." : "Ocurrio un error al guardar los cambios.";
        }

        /// <summary>
        /// Funcion para ejecutar una consulta a la base de datos.
        /// </summary>
        /// <param name="p_oMySqlCommand">MySqlCommand</param>
        /// <returns>DataTable Con los registros de la consulta.</returns>
        protected DataTable EjecutarConsulta(MySqlCommand p_oMySqlCommand)
        {
            var oDataTable = new DataTable();
            try
            {
                using(DataSet oDataSet = new DataSet())
                {
                    using(MySqlDataAdapter oMySqlDataAdapter = new MySqlDataAdapter())
                    {
                        using(MySqlConnection oMySqlConnection = new MySqlConnection(ConfigurationManager.ConnectionStrings["ProyectoSalvadorDelMundo.Properties.Settings.Connectionstring"].ConnectionString))
                        {
                            using(p_oMySqlCommand)
                            {
                                p_oMySqlCommand.CommandType = CommandType.StoredProcedure;
                                p_oMySqlCommand.Connection = oMySqlConnection;
                                oMySqlDataAdapter.SelectCommand = p_oMySqlCommand;
                                oMySqlDataAdapter.Fill(oDataSet);
                            }
                        }
                        if(oDataSet.Tables.Count > 0)
                        {
                            oDataTable = oDataSet.Tables[0];
                        }
                    }
                }
                return oDataTable;
            } 
            catch(MySqlException ex)
            {
                throw ex;
            }
        }
        #endregion

    }
}